package config

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"sync"
)

// 全局配置实例
var (
	config     *Config
	configLock sync.RWMutex
)

// LLMSettings 语言模型设置
type LLMSettings struct {
	Model      string `json:"model"`
	BaseURL    string `json:"base_url"`
	APIKey     string `json:"api_key"`
	APIType    string `json:"api_type"`
	APIVersion string `json:"api_version"`
	//OpenAI API 的参数字典
	GPTOptions map[string]interface{} `json:"gpt_options" toml:"gpt_options"`
	//使用大模型流式响应，获得更快的响应
	Stream bool `json:"stream" toml:"stream"`

	//MaxTokens      int     `json:"max_tokens"`
	//Temperature    float32 `json:"temperature"`
	MaxInputTokens *int `json:"max_input_tokens,omitempty"`
}

// ProxySettings 代理设置
type ProxySettings struct {
	Server   string `json:"server,omitempty"`
	Username string `json:"username,omitempty"`
	Password string `json:"password,omitempty"`
}

// BrowserSettings 浏览器设置
type BrowserSettings struct {
	Headless           bool           `json:"headless"`
	DisableSecurity    bool           `json:"disable_security"`
	ExtraChromiumArgs  []string       `json:"extra_chromium_args,omitempty"`
	ChromeInstancePath string         `json:"chrome_instance_path,omitempty"`
	WSSURL             string         `json:"wss_url,omitempty"`
	CDPURL             string         `json:"cdp_url,omitempty"`
	Proxy              *ProxySettings `json:"proxy,omitempty"`
	MaxContentLength   int            `json:"max_content_length"`
}

// MCPServerConfig MCP服务器配置
type MCPServerConfig struct {
	Type    string                 `json:"type"`
	URL     string                 `json:"url,omitempty"`
	Command string                 `json:"command,omitempty"`
	Args    []string               `json:"args,omitempty"`
	Env     map[string]interface{} `json:"env,omitempty"`
}

// MCPSettings MCP设置
type MCPSettings struct {
	ServerReference string                     `json:"server_reference"`
	Servers         map[string]MCPServerConfig `json:"servers,omitempty"`
}

// Config 应用程序配置
type Config struct {
	LLM           map[string]LLMSettings `json:"llm"`
	BrowserConfig *BrowserSettings       `json:"browser_config,omitempty"`
	MCPSettings   *MCPSettings           `json:"mcp_config,omitempty"`
	WorkspaceRoot string                 `json:"workspace_root"`
	ProjectRoot   string                 `json:"project_root"`
}

// GetProjectRoot 获取项目根目录
func GetProjectRoot() string {
	// 假设此函数被调用时，当前工作目录是项目根目录或其子目录
	cwd, err := os.Getwd()
	if err != nil {
		// 如果无法获取当前工作目录，使用默认值
		return "."
	}
	return cwd
}

// GetWorkspaceRoot 获取工作区根目录
func GetWorkspaceRoot() string {
	return filepath.Join(GetProjectRoot(), "workspace")
}

// LoadConfig 从文件加载配置
func LoadConfig(configPath string) (*Config, error) {
	content, err := ioutil.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("无法读取配置文件: %w", err)
	}

	var cfg Config
	err = json.Unmarshal(content, &cfg)
	if err != nil {
		return nil, fmt.Errorf("无法解析配置文件: %w", err)
	}

	// 设置默认值
	if cfg.WorkspaceRoot == "" {
		cfg.WorkspaceRoot = GetWorkspaceRoot()
	}
	if cfg.ProjectRoot == "" {
		cfg.ProjectRoot = GetProjectRoot()
	}

	return &cfg, nil
}

// GetConfig 获取全局配置实例
func GetConfig() *Config {
	configLock.RLock()
	defer configLock.RUnlock()
	return config
}

// SetConfig 设置全局配置实例
func SetConfig(cfg *Config) {
	configLock.Lock()
	defer configLock.Unlock()
	config = cfg
}

// Initialize 初始化配置
func Initialize(configPath string) error {
	cfg, err := LoadConfig(configPath)
	if err != nil {
		return err
	}
	SetConfig(cfg)
	return nil
}
